home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1995 June / MacFormat 25.iso / Shareware City / Developers / ICProgKit1.0 / Source / ICReadOnly / ICReadOnly.p next >
Text File  |  1994-11-27  |  9KB  |  323 lines

  1. unit ICReadOnly;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Components;
  7.  
  8.     function Main (var params: ComponentParameters; storage: Handle): ComponentResult;
  9.  
  10. implementation
  11.  
  12.     uses
  13. {$ifc undefined THINK_Pascal}
  14.         Types, Files, QuickDraw, Aliases, Packages, Memory, Errors, ToolUtils, Resources, 
  15.  
  16.         ICTypes, 
  17. {$endc}
  18.         Folders, ICCAPI, ICKeys;
  19.  
  20.     const
  21.         kOurComponentManufacturer = 'ICRo';
  22.  
  23.     function DecStr (l: longint): Str32;
  24.         var
  25.             tmpstr: Str255;
  26.     begin
  27.         NumToString(l, tmpstr);
  28.         DecStr := tmpstr;
  29.     end; (* DecStr *)
  30.  
  31.     const
  32.         kICCStart = 0;
  33.         kICCStop = 1;
  34.         kICCFindConfigFile = 2;
  35.         kICCSpecifyConfigFile = 3;
  36.         kICCGetSeed = 4;
  37.         kICCBegin = 5;
  38.         kICCGetPref = 6;
  39.         kICCSetPref = 7;
  40.         kICCCountPref = 8;
  41.         kICCGetIndPref = 9;
  42.         kICCEnd = 10;
  43.         kICCDefaultFile = 11;
  44.         kICCDeletePref = 12;
  45.         kICCGetPerm = 13;
  46.  
  47.         kICC_first_select = kICCStart;
  48.         kICC_last_select = kICCGetPerm;
  49.  
  50.     type
  51.         globalsRecord = record
  52.                 self: ComponentInstance;
  53.                 target: ComponentInstance;
  54.                 delegate: ComponentInstance;
  55.             end;
  56.         globalsPtr = ^globalsRecord;
  57.         globalsHandle = ^globalsPtr;
  58.  
  59.         sharedGlobals = record
  60.                 delegate: Component;
  61.             end;
  62.         sharedGlobalsPtr = ^sharedGlobals;
  63.  
  64.     function GetSharedGlobals (globals: globalsHandle): sharedGlobalsPtr;
  65.         var
  66.             shared: sharedGlobalsPtr;
  67.     begin
  68.         shared := nil;
  69.         if GetComponentInstanceA5(globals^^.self) = 0 then begin
  70.             shared := sharedGlobalsPtr(GetComponentRefcon(Component(globals^^.self)));
  71.         end
  72.         else begin
  73. (* Debugger; *)
  74. (* This, needless to say, is not the correct answer.  You're support to go madly search for the component. *)
  75. (* I just can't be bothered to deal with this at the moment. *)
  76.         end; (* if *)
  77.         GetSharedGlobals := shared;
  78.     end; (* GetSharedGlobals *)
  79.  
  80. (* Component Manager routines *)
  81.  
  82.     function RSCRegister (globals: globalsHandle): ComponentResult;
  83.         var
  84.             shared: sharedGlobalsPtr;
  85.             err: OSErr;
  86.             junk: OSErr;
  87.     begin
  88.         junk := SetDefaultComponent(Component(globals^^.self), defaultComponentIdentical + defaultComponentAnyFlags);
  89.         shared := sharedGlobalsPtr(NewPtrSysClear(sizeof(sharedGlobals)));
  90.         err := MemError;
  91.         if err = noErr then begin
  92.             shared^.delegate := nil;
  93.             SetComponentRefcon(Component(globals^^.self), longint(shared));
  94.         end; (* if *)
  95.         RSCRegister := err;
  96.     end; (* RSCRegister *)
  97.  
  98.     function RSCUnregister (globals: globalsHandle): ComponentResult;
  99.         var
  100.             shared: sharedGlobalsPtr;
  101.             result: ComponentResult;
  102.     begin
  103.         result := -1;
  104.         shared := GetSharedGlobals(globals);
  105.         if shared <> nil then begin
  106.             result := UncaptureComponent(shared^.delegate);
  107.             DisposePtr(Ptr(shared));
  108.         end; (* if *)
  109.         RSCUnregister := result;
  110.     end; (* RSCUnregister *)
  111.  
  112.     function RSCCanDo (globals: globalsHandle; selector: integer): ComponentResult;
  113.     (* Handle the Component Manager CanDo request.*)
  114.     begin
  115.         case selector of
  116.             kComponentUnregisterSelect..kComponentOpenSelect: 
  117.                 RSCCanDo := 1;
  118.             otherwise
  119.                 RSCCanDo := ComponentFunctionImplemented(globals^^.delegate, selector);
  120.         end; (* case *)
  121.     end; (* RSCCanDo *)
  122.  
  123.     function FindDelegate (after: Component): Component;
  124.         var
  125.             cd: ComponentDescription;
  126.             found_cd: ComponentDescription;
  127.             current: Component;
  128.             found: boolean;
  129.     begin
  130.         cd.componentType := internetConfigurationComponentType;
  131.         cd.componentSubType := internetConfigurationComponentSubType;
  132.         cd.componentManufacturer := OSType(0);
  133.         cd.componentFlags := 0;
  134.         cd.componentFlagsMask := 0;
  135.         current := after;
  136.         repeat
  137.             (* DebugStr(concat('in loop for ', kOurComponentManufacturer)); *)
  138.             current := FindNextComponent(current, cd);
  139.             if current <> nil then begin
  140.                 if GetComponentInfo(current, found_cd, nil, nil, nil) = noErr then begin
  141.                     found := (found_cd.componentManufacturer <> kOurComponentManufacturer);
  142.                 end; (* if *)
  143.             end; (* if *)
  144.         until found or (current = nil);
  145.         FindDelegate := current;
  146.     end; (* FindDelegate *)
  147.  
  148.     function InitGlobals (globals: globalsHandle): ComponentResult;
  149.         var
  150.             err: ComponentResult;
  151.             refnum: integer;
  152.             strh: StringHandle;
  153.             junk: OSErr;
  154.     begin
  155.         err := noErr;
  156.         InitGlobals := err;
  157.     end; (* InitGlobals *)
  158.  
  159.     function RSCOpen (globals: globalsHandle; self: ComponentInstance): ComponentResult;
  160.     (* Handle the Component Manager Open request, mostly delayed until ICCStart. *)
  161.         var
  162.             err: ComponentResult;
  163.             cap: Component;
  164.             shared: sharedGlobalsPtr;
  165.             tmp: Component;
  166.     begin
  167.         (* create our globals *)
  168.         globals := globalsHandle(NewHandleClear(sizeof(globalsRecord)));
  169.         err := MemError;
  170.         if err = noErr then begin
  171.             HLock(Handle(globals));
  172. (* Debugger; *)
  173.             globals^^.self := self;
  174.             SetComponentInstanceStorage(self, Handle(globals));
  175.             shared := GetSharedGlobals(globals);
  176.             if shared <> nil then begin
  177.                 if shared^.delegate = nil then begin
  178.                     tmp := FindDelegate(Component(self));
  179.                     if tmp <> nil then begin
  180.                         shared^.delegate := CaptureComponent(tmp, Component(self));
  181.                     end; (* if *)
  182.                 end; (* if *)
  183.                 globals^^.delegate := OpenComponent(shared^.delegate);
  184.                 err := ComponentSetTarget(self, self);
  185.             end; (* if *)
  186.             if err = noErr then begin
  187.                 err := InitGlobals(globals);
  188.             end; (* if *)
  189.             HUnlock(Handle(globals));
  190.         end; (* if *)
  191.         RSCOpen := err;
  192.     end; (* RSCOpen *)
  193.  
  194.     function RSCClose (globals: globalsHandle; self: ComponentInstance): ComponentResult;
  195.     (* Handle the Component Manager Close request. *)
  196.         var
  197.             err: ComponentResult;
  198.             junk: OSErr;
  199.     begin
  200.         err := noErr;
  201.         if globals <> nil then begin
  202.             if globals^^.delegate <> nil then begin
  203.                 junk := CloseComponent(globals^^.delegate)
  204.             end; (* if *)
  205.             DisposeHandle(Handle(globals));
  206.         end; (* if *)
  207.         RSCClose := err;
  208.     end; (* RSCClose *)
  209.  
  210.     function RSCTarget (globals: globalsHandle; new_target: ComponentInstance): ComponentResult;
  211.     (* Handle the Component Manager Target. *)
  212.         var
  213.             err: ComponentResult;
  214.     begin
  215.         globals^^.target := new_target;
  216.         if globals^^.delegate <> nil then begin
  217.             err := ComponentSetTarget(globals^^.delegate, new_target);
  218.         end
  219.         else begin
  220.             err := noErr;
  221.         end; (* if *)
  222.         RSCTarget := err;
  223.     end; (* RSCTarget *)
  224.  
  225. (* Internet Configuration specific routines *)
  226.  
  227.     const
  228.         delegateThisCallErr = 1;
  229.  
  230.     function RSCGetPref (globals: globalsHandle; key: Str255; var attr: ICAttr; buf: Ptr; var size: longint): ICError;
  231.         var
  232.             err: ICError;
  233.     begin
  234.         err := ICCGetPref(globals^^.delegate, key, attr, buf, size);
  235.         bset(attr, ICattr_locked_bit);
  236.         RSCGetPref := err;
  237.     end; (* RSCGetPref *)
  238.  
  239.     function RSCSetPref (globals: globalsHandle; key: Str255; var attr: ICAttr; buf: Ptr; var size: longint): ICError;
  240.     begin
  241.         RSCSetPref := icPermErr;
  242.     end; (* RSCSetPref *)
  243.  
  244.     function WhatToStr (what: integer): Str32;
  245.     begin
  246.         case what of
  247.             (* Component Manager stuff *)
  248.             kComponentVersionSelect: 
  249.                 WhatToStr := 'kComponentVersionSelect';
  250.             kComponentCanDoSelect: 
  251.                 WhatToStr := 'kComponentCanDoSelect';
  252.             kComponentOpenSelect: 
  253.                 WhatToStr := 'kComponentOpenSelect';
  254.             kComponentCloseSelect: 
  255.                 WhatToStr := 'kComponentCloseSelect';
  256.             kComponentTargetSelect: 
  257.                 WhatToStr := 'kComponentTargetSelect';
  258.             kComponentRegisterSelect: 
  259.                 WhatToStr := 'kComponentRegisterSelect';
  260.             kComponentUnregisterSelect: 
  261.                 WhatToStr := 'kComponentUnregisterSelect';
  262.             (* this component type stuff *)
  263.             kICCGetPref: 
  264.                 WhatToStr := 'kICCGetPref';
  265.             kICCSetPref: 
  266.                 WhatToStr := 'kICCSetPref';
  267.             otherwise
  268.                 WhatToStr := 'other';
  269.         end; (* case *)
  270.     end; (* WhatToStr *)
  271.  
  272.     function Main (var params: ComponentParameters; storage: Handle): ComponentResult;
  273.     (* Component entry point.  It's pretty neat IMHO. *)
  274.         var
  275.             proc: ProcPtr;
  276.             s: signedByte;
  277.             res: longint;
  278.     begin
  279.         proc := nil;
  280. (* DebugStr(concat('Enter ', WhatToStr(params.what))); *)
  281.         case params.what of
  282.             (* Component Manager stuff *)
  283.             kComponentVersionSelect: 
  284.                 Main := internetConfigurationComponentInterfaceVersion;
  285.             kComponentCanDoSelect: 
  286.                 proc := @RSCCanDo;
  287.             kComponentOpenSelect: 
  288.                 proc := @RSCOpen;
  289.             kComponentCloseSelect: 
  290.                 proc := @RSCClose;
  291.             kComponentTargetSelect: 
  292.                 proc := @RSCTarget;
  293.             kComponentRegisterSelect: 
  294.                 proc := @RSCRegister;
  295.             kComponentUnregisterSelect: 
  296.                 proc := @RSCUnregister;
  297.             (* this component type stuff *)
  298.             kICCGetPref: 
  299.                 proc := @RSCGetPref;
  300.             kICCSetPref: 
  301.                 proc := @RSCSetPref;
  302.             otherwise
  303.                 ;
  304.         end; (* case *)
  305.         if storage <> nil then begin
  306.             s := HGetState(storage);
  307.             HLock(storage);
  308.         end; (* if *)
  309.         res := delegateThisCallErr;
  310.         if proc <> nil then begin
  311.             res := CallComponentFunctionWithStorage(storage, params, proc);
  312.         end; (* if *)
  313.         if res = delegateThisCallErr then begin
  314.             res := DelegateComponentCall(params, globalsHandle(storage)^^.delegate);
  315.         end; (* if *)
  316. (* DebugStr(concat('Exit ', WhatToStr(params.what), ' with res ', DecStr(res))); *)
  317.         Main := res;
  318.         if storage <> nil then begin
  319.             HSetState(storage, s);
  320.         end; (* if *)
  321.     end; (* Main *)
  322.  
  323. end. (* ICReadOnly *)